home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Src / pptsapd / pptsapd-stat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  9.0 KB  |  445 lines

  1. /* pptsapd.c: pp version of the tsap daemon */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Src/pptsapd/RCS/pptsapd-stat.c,v 6.0 1991/12/18 20:27:31 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Src/pptsapd/RCS/pptsapd-stat.c,v 6.0 1991/12/18 20:27:31 jpo Rel $
  9.  *
  10.  * $Log: pptsapd-stat.c,v $
  11.  * Revision 6.0  1991/12/18  20:27:31  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include <errno.h>
  19. #include <signal.h>
  20. #include "util.h"
  21. #include "chan.h"
  22. #include <varargs.h>
  23. #include <isode/manifest.h>
  24. #include <sys/ioctl.h>
  25. #include <sys/stat.h>
  26. #include "sys.file.h"
  27. #ifndef X_OK
  28. #define X_OK    1
  29. #endif
  30. #include <sys/wait.h>
  31. #include <sys/resource.h>
  32.  
  33. #include <isode/tpkt.h>
  34.  
  35. #ifdef  TCP
  36. #include <isode/internet.h>
  37. #endif
  38. #ifdef  X25
  39. #include <isode/x25.h>
  40. #endif
  41. #ifdef  CONS
  42. #include <isode/cons.h>
  43. #endif
  44. #ifdef  TP4
  45. #include <isode/tp4.h>
  46. #endif
  47. #include <isode/isoservent.h>
  48. #include <isode/logger.h>
  49. #include <isode/tailor.h>
  50.  
  51. /*   */
  52.  
  53. static int  debug = 1;
  54. static int  nbits = FD_SETSIZE;
  55.  
  56. static char *myname = "pptsapd";
  57. static char myhost[BUFSIZ];
  58.  
  59. #define NTADDRS         FD_SETSIZE
  60.  
  61. static struct TSAPaddr *tz;
  62.  
  63.  
  64. static void    adios (), advise ();
  65.  
  66. static char *getchanpgm ();
  67. static void tsapd ();
  68. static void ts_adios ();
  69. static void ts_advise ();
  70. static void arginit ();
  71. static void envinit ();
  72. static SFD childserver ();
  73. static int childhit;
  74.  
  75. extern int  errno;
  76. extern char    *pptsapd_addr;
  77. /*   */
  78.  
  79. /* ARGSUSED */
  80.  
  81. main (argc, argv, envp)
  82. int     argc;
  83. char  **argv,
  84.       **envp;
  85. {
  86.     int       vecp;
  87.     char   *vec[4];
  88.     register struct NSAPaddr  *na;
  89.     struct TSAPdisconnect   tds;
  90.     register struct TSAPdisconnect  *td = &tds;
  91.  
  92.     arginit (argv);
  93.     envinit ();
  94.  
  95.     for (na = tz -> ta_addrs; na < &tz->ta_addrs[tz->ta_naddr]; na++) {
  96.         switch (na -> na_type) {
  97.         case NA_TCP:
  98.             advise (LLOG_NOTICE, NULLCP, "listening on TCP %s %d",
  99.                 na2str (na), ntohs (na -> na_port));
  100.             break;
  101.  
  102.         case NA_X25:
  103.             advise (LLOG_NOTICE, NULLCP, "listening on X.25 %s %s",
  104.                 na2str (na),
  105.                 sel2str (na -> na_pid, na -> na_pidlen, 1));
  106.             break;
  107.  
  108.         case NA_BRG:
  109.             advise (LLOG_NOTICE, NULLCP,
  110.                 "listening on X.25 (BRIDGE) %s %s", na2str (na),
  111.                 sel2str (na -> na_pid, na -> na_pidlen, 1));
  112.             break;
  113.  
  114.         case NA_NSAP:
  115.             advise (LLOG_NOTICE, NULLCP, "listening on NS %s",
  116.                 na2str (na));
  117.             break;
  118.  
  119.         default:
  120.             adios (NULLCP, "unknown network type 0x%x", na -> na_type);
  121.             /* NOTREACHED */
  122.         }
  123.     }
  124.     (void) TNetAccept (&vecp, vec, 0, NULLFD, NULLFD, NULLFD, OK, td);
  125.  
  126.     (void) signal (SIGCHLD, childserver);
  127.  
  128.     if (tz -> ta_selectlen)
  129.     advise (LLOG_NOTICE, NULLCP, "   %s",
  130.             sel2str (tz -> ta_selector, tz -> ta_selectlen, 1));
  131.     if (TNetListen (tz, td) == NOTOK)
  132.          ts_adios (td, LLOG_EXCEPTIONS, "listen failed");
  133.  
  134.     for (;;) {
  135.         childhit = 0;
  136.     if (TNetAccept (&vecp, vec, 0, NULLFD, NULLFD, NULLFD, NOTOK, td)
  137.         == NOTOK) {
  138.         if (childhit == 0)
  139.             ts_advise (td, LLOG_EXCEPTIONS, "accept failed");
  140.         continue;
  141.     }
  142.  
  143.     if (vecp <= 0)
  144.         continue;
  145.  
  146.     switch (TNetFork (vecp, vec, td)) {
  147.         case OK:
  148.         tsapd (vecp, vec);
  149.         exit (1);
  150.         /* NOTREACHED */
  151.  
  152.         case NOTOK:
  153.         ts_advise (td, LLOG_EXCEPTIONS, "fork failed");
  154.         default:
  155.         break;
  156.     }
  157.     }
  158. }
  159.  
  160. /*   */
  161.  
  162. static char buffer1[4096];
  163. static char buffer2[32768];
  164.  
  165.  
  166. static void  tsapd (vecp, vec)
  167. int     vecp;
  168. char  **vec;
  169. {
  170.     char    buffer[BUFSIZ];
  171.     char    buf2[BUFSIZ];
  172.     struct TSAPstart   tss;
  173.     register struct TSAPstart *ts = &tss;
  174.     struct TSAPdisconnect   tds;
  175.     register struct TSAPdisconnect  *td = &tds;
  176.     CHAN    *chan;
  177.     char    *program;
  178.  
  179. /* begin UGLY */
  180.     (void) strcpy (buffer1, vec[1]);
  181.     (void) strcpy (buffer2, vec[2]);
  182. /* end UGLY */
  183.  
  184.     if (TInit (vecp, vec, ts, td) == NOTOK) {
  185.     ts_advise (td, LLOG_EXCEPTIONS, "T-CONNECT.INDICATION");
  186.     return;
  187.     }
  188.  
  189.     advise (LLOG_NOTICE, NULLCP,
  190.         "T-CONNECT.INDICATION: <%d, <%s, %s>, <%s, %s>, %d, %d>",
  191.         ts -> ts_sd,
  192.         na2str (ts -> ts_calling.ta_addrs),
  193.         sel2str (ts -> ts_calling.ta_selector,
  194.              ts -> ts_calling.ta_selectlen, 1),
  195.         na2str (ts -> ts_called.ta_addrs),
  196.         sel2str (ts -> ts_called.ta_selector,
  197.              ts -> ts_called.ta_selectlen, 1),
  198.         ts -> ts_expedited, ts -> ts_tsdusize);
  199.  
  200.      if (ts -> ts_called.ta_selectlen == 0) {
  201.     (void) sprintf (buffer, "No TSEL present");
  202.     goto out;
  203.     }
  204.     if ((chan = ch_nm2struct (ts -> ts_called.ta_selector)) == NULL) {
  205.         (void) sprintf (buffer, "PP Service %s not found",
  206.         ts -> ts_called.ta_selector);
  207.     goto out;
  208.     }
  209.     (void) strcpy (buf2, chan -> ch_progname);
  210.     vecp = sstr2arg (buf2, 20, vec, " \t");
  211.     if (vecp <= 0)
  212.         goto out;
  213.     if ((program = getchanpgm (vec[0])) == NULLCP) {
  214.         (void) sprintf (buffer, "Can't locate program %s", vec[0]);
  215.     goto out;
  216.     }
  217.     vec[vecp] = buffer1;
  218.     vec[vecp+1] = buffer2;
  219.     vec[vecp+2] = NULLCP;
  220.     (void) execv (program, vec);
  221.     (void) sprintf (buffer, "unable to exec %s (%d args): %s", program,
  222.          vecp + 2, sys_errname (errno));
  223.     PP_OPER (NULLCP, ("%s", buffer));
  224. out: ;
  225.     advise (LLOG_EXCEPTIONS, NULLCP, "%s", buffer);
  226.     if (strlen (buffer) >= TD_SIZE)
  227.     buffer[0] = NULL;
  228.     (void) TDiscRequest (ts -> ts_sd, buffer, strlen (buffer) + 1, td);
  229.  
  230.     exit (1);
  231. }
  232.  
  233. static char    *getchanpgm (pgm)
  234. char    *pgm;
  235. {
  236.     char    buf[BUFSIZ];
  237.     static char     name[BUFSIZ];
  238.     extern char *cmddfldir, *chndfldir;
  239.  
  240.     getfpath (cmddfldir, chndfldir, buf);
  241.     getfpath (buf, pgm, name);
  242.  
  243.     return name;
  244. }
  245. /*   */
  246.  
  247. static void  ts_adios (td, code, event)
  248. register struct TSAPdisconnect *td;
  249. int    code;
  250. char    *event;
  251. {
  252.     ts_advise (td, code, event);
  253.  
  254.     exit (1);
  255. }
  256.  
  257. static void  ts_advise (td, code, event)
  258. register struct TSAPdisconnect *td;
  259. int     code;
  260. char   *event;
  261. {
  262.     char    buffer[BUFSIZ];
  263.  
  264.     if (td -> td_cc > 0)
  265.     (void) sprintf (buffer, "[%s] %*.*s",
  266.         TErrString (td -> td_reason),
  267.         td -> td_cc, td -> td_cc, td -> td_data);
  268.     else
  269.     (void) sprintf (buffer, "[%s]", TErrString (td -> td_reason));
  270.  
  271.     advise (code, NULLCP, "%s: %s", event, buffer);
  272. }
  273.  
  274. /*   */
  275.  
  276. static void arginit (vec)
  277. char    **vec;
  278. {
  279.     register char  *ap;
  280.  
  281.     if (myname = rindex (*vec, '/'))
  282.     myname++;
  283.     if (myname == NULL || *myname == NULL)
  284.     myname = *vec;
  285.  
  286.     sys_init (myname);
  287.     isodetailor (myname, 0);
  288.  
  289.     (void) strcpy (myhost, TLocalHostName ());
  290.  
  291.     tz = str2taddr (pptsapd_addr);
  292.     for (vec++; ap = *vec; vec++) {
  293.     if (*ap == '-')
  294.         switch (*++ap) {
  295.         case 'c': 
  296.             if ((ap = *++vec) == NULL || *ap == '-')
  297.             adios (NULLCP, "Usage: %s -c address", myname);
  298.             tz = str2taddr (*vec);
  299.             break;
  300.         default:
  301.            adios (NULLCP, "Usage: %s [-c address]", myname);
  302.         }
  303.     }
  304. }
  305.  
  306. static void envinit () {
  307.     int     i,
  308.         sd;
  309.  
  310.     nbits = getdtablesize ();
  311.  
  312.     if (!(debug = isatty (2))) {
  313.     for (i = 0; i < 5; i++) {
  314.         switch (fork ()) {
  315.         case NOTOK: 
  316.             sleep (5);
  317.             continue;
  318.  
  319.         case OK: 
  320.             break;
  321.  
  322.         default: 
  323.             _exit (0);
  324.         }
  325.         break;
  326.     }
  327.  
  328.     (void) chdir ("/");
  329.  
  330.     if ((sd = open ("/dev/null", O_RDWR)) == NOTOK)
  331.         adios ("/dev/null", "unable to read");
  332.     if (sd != 0)
  333.         (void) dup2 (sd, 0), (void) close (sd);
  334.     (void) dup2 (0, 1);
  335.     (void) dup2 (0, 2);
  336.  
  337. #ifdef  TIOCNOTTY
  338.     if ((sd = open ("/dev/tty", O_RDWR)) != NOTOK) {
  339.         (void) ioctl (sd, TIOCNOTTY, NULLCP);
  340.         (void) close (sd);
  341.     }
  342. #else
  343. #ifdef  SYS5
  344.     (void) setpgrp ();
  345.     (void) signal (SIGINT, SIG_IGN);
  346.     (void) signal (SIGQUIT, SIG_IGN);
  347. #endif
  348. #endif
  349.     }
  350.     else
  351.     pp_log_norm -> ll_stat |= LLOGTTY;
  352.  
  353. #ifndef sun             /* damn YP... */
  354.     for (sd = 3; sd < nbits; sd++)
  355.     (void) close (sd);
  356. #endif
  357.  
  358.     (void) signal (SIGPIPE, SIG_IGN);
  359.  
  360.     ll_hdinit (pp_log_norm, myname);
  361.     advise (LLOG_NOTICE, NULLCP, "starting");
  362. }
  363.  
  364. /*     ERRORS */
  365.  
  366. #ifndef lint
  367. static void    adios (va_alist)
  368. va_dcl
  369. {
  370.     va_list ap;
  371.  
  372.     va_start (ap);
  373.  
  374.     _ll_log (pp_log_norm, LLOG_FATAL, ap);
  375.  
  376.     va_end (ap);
  377.  
  378.     _exit (1);
  379. }
  380. #else
  381. /* VARARGS */
  382.  
  383. static void    adios (what, fmt)
  384. char   *what,
  385.        *fmt;
  386. {
  387.     adios (what, fmt);
  388. }
  389. #endif
  390.  
  391.  
  392. #ifndef lint
  393. static void    advise (va_alist)
  394. va_dcl
  395. {
  396.     int     code;
  397.     va_list ap;
  398.  
  399.     va_start (ap);
  400.  
  401.     code = va_arg (ap, int);
  402.  
  403.     _ll_log (pp_log_norm, code, ap);
  404.  
  405.     va_end (ap);
  406. }
  407. #else
  408. /* VARARGS */
  409.  
  410. static void    advise (code, what, fmt)
  411. char   *what,
  412.        *fmt;
  413. int     code;
  414. {
  415.     advise (code, what, fmt);
  416. }
  417. #endif
  418.  
  419. static SFD childserver (sig, code, sc)
  420. int    sig;
  421. long    code;
  422. struct sigcontext *sc;
  423. {
  424.     union wait status;
  425.     struct rusage rusage;
  426.     int    pid;
  427.  
  428.     childhit = 1;
  429.     while ((pid = wait3 (&status, WNOHANG, &rusage)) > 0) {
  430.         PP_NOTICE (("Pid %d: Resource usage ut %d.%d st %d.%d mrss %d \
  431. ixrss %d idrss %d isrss %d minflt %d majflt %d nswap %d ib %d ob %d ms %d mr %d ns %d nvcs %d nics %d",
  432.                 pid,
  433.                 rusage.ru_utime.tv_sec, rusage.ru_utime.tv_usec,
  434.                 rusage.ru_stime.tv_sec, rusage.ru_stime.tv_usec,
  435.                 rusage.ru_maxrss, rusage.ru_ixrss, rusage.ru_idrss,
  436.                 rusage.ru_isrss, rusage.ru_minflt, rusage.ru_majflt,
  437.                 rusage.ru_nswap, rusage.ru_inblock,
  438.                 rusage.ru_oublock, rusage.ru_msgsnd,
  439.                 rusage.ru_msgrcv, rusage.ru_nsignals,
  440.                 rusage.ru_nvcsw, rusage.ru_nivcsw));
  441.     }
  442. }
  443.  
  444.         
  445.